#ifndef __MINIUTIL_BUF2TYPE_H__
#define __MINIUTIL_BUF2TYPE_H__

#ifdef WIN32
	#include <winsock2.h>
#else
	#include <sys/types.h>
	#include <sys/socket.h>
	#include <netinet/in.h>
	#include <cstring>
#endif

namespace miniutil
{
#ifdef SOFT_ALIGEMENT
	inline int GET_NET_INT_VALUE(const char* buf)
	{
		int ivalue;
		memcpy(&ivalue, buf, 4);
		return ntohl(ivalue);
	}
	
	inline short GET_NET_SHORT_VALUE(const char* buf)
	{
		short svalue;
		memcpy(&svalue, buf, 2);
		return ntohs(svalue);
	}
	
	inline void SET_NET_INT_VALUE(char* buf, int value)
	{
		int ivalue = htonl(value);
		memcpy(buf, &ivalue, 4);
	}
	
	inline void SET_NET_SHORT_VALUE(char* buf, short value)
	{
		short svalue = htons(value);
		memcpy(buf, &svalue, 2);
	}
#else
	inline int GET_NET_INT_VALUE(const char* buf)
	{
		return ntohl(*((int*)buf));
	}
	
	inline short GET_NET_SHORT_VALUE(const char* buf)
	{
		return ntohs(*((short*)buf));
	}

	
	inline void SET_NET_INT_VALUE(char* buf, int value)
	{
		*((int*)buf) = htonl(value);
	}
	
	inline void SET_NET_SHORT_VALUE(char* buf, short value)
	{
		*((short*)buf) = htons(value);
	}

	
#endif
	inline long long GET_NET_LL_VALUE(const char* buf)
	{
		unsigned int lowvalue;
		unsigned int highvalue;
		highvalue = GET_NET_INT_VALUE(buf);
		lowvalue =  GET_NET_INT_VALUE(buf+4);
		return ((((long long)highvalue)<<32)|lowvalue);
	}

	inline void SET_NET_LL_VALUE(char* buf, long long value)
	{
		unsigned int lowvalue;
		unsigned int highvalue;
		highvalue = (unsigned int)((value>>32)&0xffffffff);
		lowvalue = (unsigned int)(value&0xffffffff);

		SET_NET_INT_VALUE(buf, highvalue);
		SET_NET_INT_VALUE(buf+4, lowvalue);
	}

}

#endif
